#include "device_tft.h"

void TFTControl::init(void)
{
    // 初始化页面路由
    m_pageRouteMap[PAGE_NAME::PAGE_HOME] = {[this](){pageHome();}, nullptr, nullptr, nullptr, 0, 0, false, 0};;
    // 初始化液晶
    m_tftCtl = new TFT_eSPI();
    m_tftCtl->init();
    m_tftCtl->fillScreen(TFT_BLACK);
    // 默认显示首页
    pageHome();
}

void TFTControl::displayChineseChar(uint16_t x, uint16_t y, uint16_t textColor, uint16_t bgColor, const std::string font) {
    uint16_t i, j, byteIndex, bitIndex;
    uint8_t currentByte;
    int fontIndex = findText(font);
    if (fontIndex < 0) return;
    for (j = 0; j < 16; j++) {         // 遍历每一行 (Y方向)
        for (i = 0; i < 2; i++) {      // 每行2字节 (16像素 / 8 = 2字节)
            byteIndex = j * 2 + i;      // 计算当前字节在数组中的位置
            currentByte = chineseChar16x16[fontIndex][byteIndex]; // 读取当前字节

            for (bitIndex = 0; bitIndex < 8; bitIndex++) { // 遍历当前字节的每个bit (MSB优先，即从左到右)
                if (currentByte & (0x80 >> bitIndex)) { // 如果该bit为1，显示文字颜色
                    m_tftCtl->drawPixel(x + (i * 8) + bitIndex , y + j ,textColor);
                } else { // 如果该bit为0，显示背景颜色
                    m_tftCtl->drawPixel(x + (i * 8) + bitIndex , y + j ,bgColor);
                }
            }
        }
    }
}

void TFTControl::displayNumber(uint16_t x, uint16_t y, uint16_t textColor, uint16_t bgColor, const std::string font)
{
    uint16_t i, j, byteIndex, bitIndex;
    uint8_t currentByte;
    int fontIndex = std::stoi(font);
    for (j = 0; j < 24; j++) {         // 遍历每一行 (Y方向)
        for (i = 0; i < 2; i++) {      // 每行2字节 (16像素 / 8 = 2字节)
            byteIndex = j * 2 + i;      // 计算当前字节在数组中的位置
            currentByte = numberChar24x40[fontIndex][byteIndex]; // 读取当前字节

            for (bitIndex = 0; bitIndex < 8; bitIndex++) { // 遍历当前字节的每个bit (MSB优先，即从左到右)
                if (currentByte & (0x80 >> bitIndex)) { // 如果该bit为1，显示文字颜色
                    m_tftCtl->drawPixel(x + (i * 8) + bitIndex , y + j ,textColor);
                } else { // 如果该bit为0，显示背景颜色
                    m_tftCtl->drawPixel(x + (i * 8) + bitIndex , y + j ,bgColor);
                }
            }
        }
    }
}

void TFTControl::pageHome(void)
{
    displayChineseChar(TFT_X_STA+CHAR_WIDTH*0 , TFT_Y_STA+CHAR_WIDTH*0+OPTION_SLOT*0, TFT_WHITE,TFT_BLACK, "土");
    displayChineseChar(TFT_X_STA+CHAR_WIDTH*1 , TFT_Y_STA+CHAR_WIDTH*0+OPTION_SLOT*0, TFT_WHITE,TFT_BLACK, "壤");
    displayChineseChar(TFT_X_STA+CHAR_WIDTH*2 , TFT_Y_STA+CHAR_WIDTH*0+OPTION_SLOT*0, TFT_WHITE,TFT_BLACK, "湿");
    displayChineseChar(TFT_X_STA+CHAR_WIDTH*3 , TFT_Y_STA+CHAR_WIDTH*0+OPTION_SLOT*0, TFT_WHITE,TFT_BLACK, "度");
    displayChineseChar(TFT_X_STA+CHAR_WIDTH*0 , TFT_Y_STA+CHAR_WIDTH*1+OPTION_SLOT*1, TFT_WHITE,TFT_BLACK, "空");
    displayChineseChar(TFT_X_STA+CHAR_WIDTH*1 , TFT_Y_STA+CHAR_WIDTH*1+OPTION_SLOT*1, TFT_WHITE,TFT_BLACK, "气");
    displayChineseChar(TFT_X_STA+CHAR_WIDTH*2 , TFT_Y_STA+CHAR_WIDTH*1+OPTION_SLOT*1, TFT_WHITE,TFT_BLACK, "温");
    displayChineseChar(TFT_X_STA+CHAR_WIDTH*3 , TFT_Y_STA+CHAR_WIDTH*1+OPTION_SLOT*1, TFT_WHITE,TFT_BLACK, "度");
    displayChineseChar(TFT_X_STA+CHAR_WIDTH*0 , TFT_Y_STA+CHAR_WIDTH*2+OPTION_SLOT*2, TFT_WHITE,TFT_BLACK, "电");
    displayChineseChar(TFT_X_STA+CHAR_WIDTH*3 , TFT_Y_STA+CHAR_WIDTH*2+OPTION_SLOT*2, TFT_WHITE,TFT_BLACK, "机");
    displayChineseChar(TFT_X_STA+CHAR_WIDTH*0 , TFT_Y_STA+CHAR_WIDTH*3+OPTION_SLOT*3, TFT_WHITE,TFT_BLACK, "关");    
    displayChineseChar(TFT_X_STA+CHAR_WIDTH*3 , TFT_Y_STA+CHAR_WIDTH*3+OPTION_SLOT*3, TFT_WHITE,TFT_BLACK, "于");  
}

void TFTControl::pageTemp(void)
{

}

void TFTControl::pageHumi(void)
{

}

TFTControl::~TFTControl()
{
    if (m_tftCtl == nullptr) {
        delete m_tftCtl;
    }
}